
/*
This file is part of MJIN2.

Copyright (C) 2012-2013 Opensource Game Studio

This software is provided 'as-is', without any express or implied
warranty.  In no event will the authors be held liable for any damages
arising from the use of this software.

Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:

1. The origin of this software must not be misrepresented; you must not
   claim that you wrote the original software. If you use this software
   in a product, an acknowledgment in the product documentation would be
   appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
   misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
*/

#ifndef MJIN2_VIDEO_INFO_H
#define MJIN2_VIDEO_INFO_H

#include <mjin2/TypeDefs.h>

namespace mjin2
{

struct VideoInfo
{
    VideoInfo();

    String glVersion;
    String glVendor;
    String glRenderer;
    String glslVersion;
    bool glslSupported;
    bool glsl100Supported;
    bool fragmentShaderSupported;
    bool geometryShader4Supported;
    bool gpuShader4Supported;
    bool gpuShaderFp64Supported;
    bool shaderAtomicCounterSupported;
    bool shaderObjectsSupported;
    bool tessellationShadersSupported;
    bool uniformBufferObjectSupported;
    bool vertexShaderSupported;
    bool gl12;
    s32  gl12Max3DTextureSize;
    s32  gl12MaxElementsIndices;
    s32  gl12MaxElementsVertices;
    bool gl13;
    s32  gl13MaxCubeMapTextureSize;
    s32  gl13MaxTextureUnits;
    bool gl14;
    s32  gl14MaxTextureLODBias;
    bool gl20;
    s32  gl20MaxDrawbuffers;
    s32  gl20MaxVertexAttribs;
    s32  gl20MaxTextureImageUnits;
    s32  gl20MaxFragmentUniformComponents;
    s32  gl20MaxVertexUniformComponents;
    s32  gl20MaxVaryingFloats;
    s32  gl20MaxVertexTextureImageUnits;
    s32  gl20MaxCombinedTextureImageUnits;
    s32  gl20MaxTextureCoords;
    bool gl30;
    s32  gl30MaxClipDistances;
    s32  gl30MaxArrayTextureLayers;
    s32  gl30MaxVaryingComponents;
    s32  gl30MaxTransformFeedbackSeparateComponents;
    s32  gl30MaxTransformFeedbackInterleavedComponents;
    s32  gl30MaxTransformFeedbackSeparateAttribs;
    s32  gl30MaxRenderbufferSize;
    s32  gl30MaxColorAttachments;
    s32  gl30MaxSamples;
    bool gl31;
    s32  gl31MaxTextureBufferSize;
    s32  gl31MaxRectangleTextureSize;
    s32  gl31MaxVertexUniformBlocks;
    s32  gl31MaxFragmentUniformBlocks;
    s32  gl31MaxCombinedUniformBlocks;
    s32  gl31MaxUniformBufferBindings;
    s32  gl31MaxUniformBlockSize;
    s32  gl31MaxCombinedVertexUniformComponents;
    s32  gl31MaxCombinedFragmentUniformComponents;
    bool gl32;
    s32  gl32MaxGeometryTextureImageUnits;
    s32  gl32MaxGeometryUniformComponents;
    s32  gl32MaxGeometryOutputVertices;
    s32  gl32MaxGeometryTotalOutputComponents;
    s32  gl32MaxVertexOutputComponents;
    s32  gl32MaxGeometryInputComponents;
    s32  gl32MaxGeometryOutputComponents;
    s32  gl32MaxFragmentInputComponets;
    s32  gl32MaxVaryingComponets;
    s32  gl32MaxServerWaitTimeout;
    s32  gl32MaxSampleMaskWords;
    s32  gl32MaxColorTextureSamples;
    s32  gl32MaxDepthTextureSamples;
    s32  gl32MaxIntegerSamples;
    bool gl33;
    s32  gl33MaxDualSourceDrawbuffers;
    bool gl40;
    s32  gl40MaxGeometryShaderInvocations;
    s32  gl40MaxVertexStreams;
    s32  gl40MaxSubroutines;
    s32  gl40MaxSubroutineUniformLocations;
    s32  gl40MaxPatchVertices;
    s32  gl40MaxTessGenLevel;
    s32  gl40MaxTessControlUniformComponents;
    s32  gl40MaxTessEvaluationUniformComponents;
    s32  gl40MaxTessControlTextureImageUnits;
    s32  gl40MaxTessEvaluationTextureImageUnits;
    s32  gl40MaxTessControlOutputComponents;
    s32  gl40MaxTessPatchComponents;
    s32  gl40MaxTessControlTotalOutputComponents;
    s32  gl40MaxTessEvaluationOutputComponents;
    s32  gl40MaxTessControlUniformBlocks;
    s32  gl40MaxTessEvaluationUniformBlocks;
    s32  gl40MaxTessControlInputComponents;
    s32  gl40MaxTessEvaluationInputComponents;
    s32  gl40MaxCombinedTessControlUniformComponents;
    s32  gl40MaxCombinedTessEvaluationUniformComponents;
    s32  gl40MaxTransformFeedbackBuffers;
    bool gl41;
    s32  gl41MaxVertexUniformVectors;
    s32  gl41MaxVaryingVectors;
    s32  gl41MaxFragmentUniformVectors;
    s32  gl41MaxViewports;
    bool gl42;
    s32  gl42MaxVertexAtomicCounterBuffers;
    s32  gl42MaxTessControlAtomicCounterBuffers;
    s32  gl42MaxTessEvaluationAtomicCounterBuffers;
    s32  gl42MaxGeometryAtomicCounterBuffers;
    s32  gl42MaxFragmentAtomicCounterBuffers;
    s32  gl42MaxCombinedAtomicCounterBuffers;
    s32  gl42MaxVetexAtomicCounters;
    s32  gl42MaxTessControlAtomicCounters;
    s32  gl42MaxTessEvaluationAtomicCounters;
    s32  gl42MaxGeometryAtomicCounters;
    s32  gl42MaxFragmentAtomicCounters;
    s32  gl42MaxCombinedAtomicCounters;
    s32  gl42MaxAtomicCounterBufferSize;
    s32  gl42MaxAtomicCounterBufferBindings;
    s32  gl42MaxImageUnits;
    s32  gl42MaxCombinedImageUnitsAndFragmentOutputs;
    s32  gl42MaxImageSamples;
    s32  gl42MaxVertexImageUniforms;
    s32  gl42MaxTessControlImageUniforms;
    s32  gl42MaxTessEvaluationImageUniforms;
    s32  gl42MaxGeometryImageUniforms;
    s32  gl42MaxFragmentImageUniforms;
    s32  gl42MaxCombinedImageUniforms;
    bool gl43;
    s32  gl43MaxElementIndex;
    s32  gl43MaxComputeUniformBlocks;
    s32  gl43MaxComputeTextureImageUnits;
    s32  gl43MaxComputeImageUniforms;
    s32  gl43MaxComputeSharedMemorySize;
    s32  gl43MaxComputeUniformComponents;
    s32  gl43MaxComputeAtomicCounterBuffers;
    s32  gl43MaxComputeAtomicCounters;
    s32  gl43MaxCombinedComputeUniformComponents;
    s32  gl43MaxComputeLocalInvocations;
    s32  gl43MaxComputeWorkGroupCount;
    s32  gl43MaxComputeWorkGroupSize;
    s32  gl43MaxDebugMessageLength;
    s32  gl43MaxDebugLoggedMessages;
    s32  gl43MaxDebugGroupStackDepth;
    s32  gl43MaxLabelLength;
    s32  gl43MaxUniformLocations;
    s32  gl43MaxFrameBufferWidth;
    s32  gl43MaxFrameBufferHeight;
    s32  gl43MaxFrameBufferLayers;
    s32  gl43MaxFrameBufferSamples;
    s32  gl43MaxWidth;
    s32  gl43MaxHeight;
    s32  gl43MaxDepth;
    s32  gl43MaxLayers;
    s32  gl43MaxCombinedDimensions;
    s32  gl43MaxNameLength;
    s32  gl43MaxNumActiveVariables;
    s32  gl43MaxNumCompatibleSubroutines;
    s32  gl43MaxVertexShaderStorageBlocks;
    s32  gl43MaxGeometryShaderStorageBlocks;
    s32  gl43MaxTessControlShaderStorageBlocks;
    s32  gl43MaxTessEvaluationShaderStorageBlocks;
    s32  gl43MaxFragmentShaderStorageBlocks;
    s32  gl43MaxComputeShaderStorageBlocks;
    s32  gl43MaxCombinedShaderStorageBlocks;
    s32  gl43MaxShaderStorageBufferBindings;
    s32  gl43MaxShaderStorageBlockSize;
    s32  gl43MaxCombinedShaderOutputResources;
    s32  gl43MaxVertexAttribRelativeOffset;
    s32  gl43MaxVertexAttribBindings;
    bool arbImaging;
    s32  arbImagingMaxConvolutionWidth;
    s32  arbImagingMaxConvolutionHeight;
    s32  arbImagingMaxColorMatrixStackDepth;
    bool arbMultitexture;
    s32  arbMultitextureMaxTextureUnitsARB;
    bool arbTextureCubeMap;
    s32  arbTextureCubeMapMaxCubeMapTextureSizeARB;
    bool arbVertexBlend;
    s32  arbVertexBlendMaxVertexUnitsARB;
    bool arbMatrixPalette;
    s32  arbMatrixPaletteMaxMatrixPaletteStackDepthARB;
    s32  arbMatrixPaletteMaxPaletteMatricesARB;
    bool arbVertexProgram;
    s32  arbVertexProgramMaxProgramMatrixStackDepthARB;
    s32  arbVertexProgramMaxProgramMatricesARB;
    s32  arbVertexProgramMaxVertexAttribsARB;
    s32  arbVertexProgramMaxProgramInstructionsARB;
    s32  arbVertexProgramMaxProgramNativeInstructionsARB;
    s32  arbVertexProgramMaxProgramTemporariesARB;
    s32  arbVertexProgramMaxProgramNativeTemporariesARB;
    s32  arbVertexProgramMaxProgramParametersARB;
    s32  arbVertexProgramMaxProgramNativeParametersARB;
    s32  arbVertexProgramMaxProgramAttribsARB;
    s32  arbVertexProgramMaxProgramNativeAttribsARB;
    s32  arbVertexProgramMaxProgramAddressRegistersARB;
    s32  arbVertexProgramMaxProgramNativeAddressRegistersARB;
    s32  arbVertexProgramMaxProgramLocalParametersARB;
    s32  arbVertexProgramMaxProgramEnvParametersARB;
    bool arbFragmentProgram;
    s32  arbFragmentProgramMaxProgramAluInstructionsARB;
    s32  arbFragmentProgramMaxProgramTexInstructionsARB;
    s32  arbFragmentProgramMaxProgramTexIndirectionsARB;
    s32  arbFragmentProgramMaxProgramNativeAluInstructionsARB;
    s32  arbFragmentProgramMaxProgramNativeTexInstructionsARB;
    s32  arbFragmentProgramMaxProgramNativeTexIndirectionsARB;
    s32  arbFragmentProgramMaxTextureCoordsARB;
    s32  arbFragmentProgramMaxTextureImageUnitsARB;
    bool arbVertexShader;
    s32  arbVertexShaderMaxVertexUniformComponentsARB;
    s32  arbVertexShaderMaxVaryingFloatsARB;
    s32  arbVertexShaderMaxVertexTextureImageUnitsARB;
    s32  arbVertexShaderMaxCombinedTextureImageUnitsARB;
    bool arbFragmentShader;
    s32  arbFragmentShaderMaxFragmentUniformComponentsARB;
    bool arbDrawbuffers;
    s32  arbDrawbuffersMaxDrawbuffersARB;
    bool arbTextureRectangle;
    s32  arbTextureRectangleMaxRectangleTextureSizeARB;
    bool arbFramebufferObject;
    s32  arbFramebufferObjectMaxRenderbufferSize;
    s32  arbFramebufferObjectMaxColorAttachments;
    s32  arbFramebufferObjectMaxSamples;
    bool arbGeometryShader4;
    s32  arbGeometryShader4MaxGeometryTextureImageUnitsARB;
    s32  arbGeometryShader4MaxGeometryVaryingComponentsARB;
    s32  arbGeometryShader4MaxVertexVaryingComponentsARB;
    s32  arbGeometryShader4MaxGeometryUniformComponentsARB;
    s32  arbGeometryShader4MaxGeometryOutputVerticesARB;
    s32  arbGeometryShader4MaxGeometryTotalOutputComponentsARB;
    bool arbTextureBufferObject;
    s32  arbTextureBufferObjectMaxTextureBufferSizeARB;
    bool arbUniformBufferObject;
    s32  arbUniformBufferObjectMaxVertexUniformBlocks;
    s32  arbUniformBufferObjectMaxGeometryUniformBlocks;
    s32  arbUniformBufferObjectMaxFragmentUniformBlocks;
    s32  arbUniformBufferObjectMaxCombinedUniformBlocks;
    s32  arbUniformBufferObjectMaxUniformBufferBindings;
    s32  arbUniformBufferObjectMaxUniformBlockSize;
    s32  arbUniformBufferObjectMaxCombinedVertexUniformComponents;
    s32  arbUniformBufferObjectMaxCombinedGeometryUniformComponents;
    s32  arbUniformBufferObjectMaxCombinedFragmentUniformComponents;
    bool arbSync;
    s32  arbSyncMaxServerWaitTimeout;
    bool arbTextureMultisample;
    s32  arbTextureMultisampleMaxSampleMaskWords;
    s32  arbTextureMultisampleMaxColorTextureSamples;
    s32  arbTextureMultisampleMaxDepthTextureSamples;
    s32  arbTextureMultisampleMaxIntegerSamples;
    bool arbTextureGather;
    s32  arbTextureGatherMaxProgramTextureGatherComponentsARB;
    bool arbBlendFuncExtended;
    s32  arbBlendFuncExtendedMaxDualSourceDrawBuffers;
    bool arbGpuShader5;
    s32  arbGpuShader5MaxGeometryShaderInvocations;
    bool arbShaderSubroutine;
    s32  arbShaderSubroutineMaxSubroutines;
    s32  arbShaderSubroutineMaxSubroutineUniformLocations;
    bool arbTessellationShader;
    s32  arbTessellationShaderMaxPatchVertices;
    s32  arbTessellationShaderMaxTessGenLevel;
    s32  arbTessellationShaderMaxTessControlUniformComponents;
    s32  arbTessellationShaderMaxTessEvaluationUniformComponents;
    s32  arbTessellationShaderMaxTessControlTextureImageUnits;
    s32  arbTessellationShaderMaxTessEvaluationTextureImageUnits;
    s32  arbTessellationShaderMaxTessControlOutputComponents;
    s32  arbTessellationShaderMaxTessPatchComponents;
    s32  arbTessellationShaderMaxTessControlTotalOutputComponents;
    s32  arbTessellationShaderMaxTessEvaluationOutputComponents;
    s32  arbTessellationShaderMaxTessControlUniformBlocks;
    s32  arbTessellationShaderMaxTessEvaluationUniformBlocks;
    s32  arbTessellationShaderMaxTessControlInputComponents;
    s32  arbTessellationShaderMaxTessEvaluationInputComponents;
    s32  arbTessellationShaderMaxCombinedTessControlUniformComponents;
    s32  arbTessellationShaderMaxCombinedTessEvaluationUniformComponents;
    bool arbTransformFeedback3;
    s32  arbTransformFeedback3MaxTransformFeedbackBuffers;
    s32  arbTransformFeedback3MaxVertexStreams;
    bool arbES2Compatibility;
    s32  arbES2CompatibilityMaxVertexUniformVectors;
    s32  arbES2CompatibilityMaxVaryingVectors;
    s32  arbES2CompatibilityMaxFragmentUniformVectors;
    bool arbViewportArray;
    s32  arbViewportArrayMaxViewports;
    bool arbDebugOutput;
    s32  arbDebugOutputMaxDebugMessageLengthARB;
    s32  arbDebugOutputMaxDebugLoggedMessagesARB;
    bool arbShaderAtomicCounters;
    s32  arbShaderAtomicCountersMaxVertexAtomicCounterBuffers;
    s32  arbShaderAtomicCountersMaxTessControlAtomicCounterBuffers;
    s32  arbShaderAtomicCountersMaxTessEvaluationAtomicCounterBuffers;
    s32  arbShaderAtomicCountersMaxGeometryAtomicCounterBuffers;
    s32  arbShaderAtomicCountersMaxFragmentAtomicCounterBuffers;
    s32  arbShaderAtomicCountersMaxCombinedAtomicCounterBuffers;
    s32  arbShaderAtomicCountersMaxVertexAtomicCounters;
    s32  arbShaderAtomicCountersMaxTessControlAtomicCounters;
    s32  arbShaderAtomicCountersMaxTessEvaluationAtomicCounters;
    s32  arbShaderAtomicCountersMaxGeometryAtomicCounters;
    s32  arbShaderAtomicCountersMaxFragmentAtomicCounters;
    s32  arbShaderAtomicCountersMaxCombinedAtomicCounters;
    s32  arbShaderAtomicCountersMaxAtomicCounterBufferSize;
    s32  arbShaderAtomicCountersMaxAtomicCounterBufferBindings;
    bool arbShaderImageLoadStore;
    s32  arbShaderImageLoadStoreMaxImageUnits;
    s32  arbShaderImageLoadStoreMaxCombinedImageUnitsAndFragmentOutputs;
    s32  arbShaderImageLoadStoreMaxImageSamples;
    s32  arbShaderImageLoadStoreMaxVertexImageUniforms;
    s32  arbShaderImageLoadStoreMaxTessControlImageUniforms;
    s32  arbShaderImageLoadStoreMaxTessEvaluationImageUniforms;
    s32  arbShaderImageLoadStoreMaxGeometryImageUniforms;
    s32  arbShaderImageLoadStoreMaxFragmentImageUniforms;
    s32  arbShaderImageLoadStoreMaxCombinedImageUniforms;
    bool khrDebug;
    s32  khrDebugMaxDebugGroupStackDepth;
    s32  khrDebugMaxLabelLength;
    s32  khrDebugMaxDebugMessageLength;
    s32  khrDebugMaxDebugLoggedMessages;
    bool arbComputeShader;
    s32  arbComputeShaderMaxComputeUniformBlocks;
    s32  arbComputeShaderMaxComputeTextureImageUnits;
    s32  arbComputeShaderMaxComputeImageUniforms;
    s32  arbComputeShaderMaxComputeSharedMemorySize;
    s32  arbComputeShaderMaxComputeUniformComponents;
    s32  arbComputeShaderMaxComputeAtomicCounterBuffers;
    s32  arbComputeShaderMaxComputeAtomicCounters;
    s32  arbComputeShaderMaxCombinedComputeUniformComponents;
    s32  arbComputeShaderMaxComputeLocalInvocations;
    s32  arbComputeShaderMaxComputeWorkGroupCount;
    s32  arbComputeShaderMaxComputeWorkGroupSize;
    bool arbVertexAttribBinding;
    s32  arbVertexAttribBindingMaxVertexAttribRelativeOffset;
    s32  arbVertexAttribBindingMaxVertexAttribBindings;
    bool arbES3Compatibility;
    s32  arbES3CompatibilityMaxElementIndex;
    bool arbExplicitUniformLocation;
    s32  arbExplicitUniformLocationMaxUniformLocations;
    bool arbFramebufferNoAttachments;
    s32  arbFramebufferNoAttachmentsMaxFramebufferWidth;
    s32  arbFramebufferNoAttachmentsMaxFramebufferHeight;
    s32  arbFramebufferNoAttachmentsMaxFramebufferLayers;
    s32  arbFramebufferNoAttachmentsMaxFramebufferSamples;
    bool arbInternalformatQuery2;
    s32  arbInternalformatQuery2MaxWidth;
    s32  arbInternalformatQuery2MaxHeight;
    s32  arbInternalformatQuery2MaxDepth;
    s32  arbInternalformatQuery2MaxLayers;
    s32  arbInternalformatQuery2MaxCombinedDimensions;
    bool arbProgramInterfaceQuery;
    s32  arbProgramInterfaceQueryMaxNameLength;
    s32  arbProgramInterfaceQueryMaxNumActiveVariables;
    s32  arbProgramInterfaceQueryMaxNumCompatibleSubroutines;
    bool arbShaderStorageBufferObject;
    s32  arbShaderStorageBufferObjectMaxVertexShaderStorageBlocks;
    s32  arbShaderStorageBufferObjectMaxGeometryShaderStorageBlocks;
    s32  arbShaderStorageBufferObjectMaxTessControlShaderStorageBlocks;
    s32  arbShaderStorageBufferObjectMaxTessEvaluationShaderStorageBlocks;
    s32  arbShaderStorageBufferObjectMaxFragmentShaderStorageBlocks;
    s32  arbShaderStorageBufferObjectMaxComputeShaderStorageBlocks;
    s32  arbShaderStorageBufferObjectMaxCombinedShaderStorageBlocks;
    s32  arbShaderStorageBufferObjectMaxShaderStorageBufferBindings;
    s32  arbShaderStorageBufferObjectMaxShaderStorageBlockSize;
    s32  arbShaderStorageBufferObjectMaxCombinedShaderOutputResources;
    bool extTexture3D;
    s32  extTexture3DMax3DTextureSizeExt;
    bool extConvolution;
    s32  extConvolutionMaxConvolutionWidthExt;
    s32  extConvolutionMaxConvolutionHeightExt;
    bool sgiColorMatrix;
    s32  sgiColorMatrixMaxColorMatrixStackDepthSGI;
    bool sgisTexture4D;
    s32  sgisTexture4DMax4DTextureSizeSGIS;
    bool sgixClipmap;
    s32  sgixClipmapMaxClipmapDepthSGIX;
    s32  sgixClipmapMaxClipmapVirtualDepthSGIX;
    bool sgixFramezoom;
    s32  sgixFramezoomMaxFramezoomFactorSGIX;
    bool sgixPolynomialFfd;
    s32  sgixPolynomialFfdMaxDeformationOrderSGIX;
    bool sgisFogFunction;
    s32  sgisFogFunctionMaxFogFuncPointsSGIS;
    bool pgiVertexHints;
    s32  pgiVertexHintsMaxVertexHintPGI;
    bool sgixFragmentLighting;
    s32  sgixFragmentLightingMaxFragmentLightsSGIX;
    s32  sgixFragmentLightingMaxActiveLightsSGIX;
    bool extDrawRangeElements;
    s32  extDrawRangeElementsMaxElementsVerticesExt;
    s32  extDrawRangeElementsMaxElementsIndicesExt;
    bool sgixAsyncPixel;
    s32  sgixAsyncPixelMaxAsyncTexImageSGIX;
    s32  sgixAsyncPixelMaxAsyncDrawPixelsSGIX;
    s32  sgixAsyncPixelMaxAsyncReadPixelsSGIX;
    bool sgixAsyncHistogram;
    s32  sgixAsyncHistogramMaxAsyncHistogramSGIX;
    bool extPixelTransform;
    s32  extPixelTransformMaxPixelTransform2DStackDepthExt;
    bool extTextureCubeMap;
    s32  extTextureCubeMapMaxCubeMapTextureSizeExt;
    bool extTextureLodBias;
    s32  extTextureLodBiasMaxTextureLodBiasExt;
    bool extTextureFilterAnisotropic;
    s32  extTextureFilterAnisotropicMaxTextureMaxAnisotropyExt;
    bool nvLightMaxExponent;
    s32  nvLightMaxExponentMaxShininessNV;
    s32  nvLightMaxExponentMaxSpotExponentNV;
    bool nvVertexArrayRange;
    s32  nvVertexArrayRangeMaxVertexArrayRangeElementNV;
    bool nvRegisterCombiners;
    s32  nvRegisterCombinersMaxGeneralCombinersNV;
    bool nvEvaluators;
    s32  nvEvaluatorsMaxMapTessellationNV;
    s32  nvEvaluatorsMaxRationalEvalOrderNV;
    bool nvTextureRectangle;
    s32  nvTextureRectangleMaxRectangleTextureSizeNV;
    bool nvVertexProgram;
    s32  nvVertexProgramMaxTrackMatrixStackDepthNV;
    s32  nvVertexProgramMaxTrackMatricesNV;
    bool atiPnTriangles;
    s32  atiPnTrianglesMaxPnTrianglesTesselationLevelATI;
    bool extVertexShader;
    s32  extVertexShaderMaxVertexShaderInstructionsExt;
    s32  extVertexShaderMaxVertexShaderVariantsExt;
    s32  extVertexShaderMaxVertexShaderInvariantsExt;
    s32  extVertexShaderMaxVertexShaderLocalConstantsExt;
    s32  extVertexShaderMaxVertexShaderLocalsExt;
    s32  extVertexShaderMaxOptimizedVertexShaderInstructionsExt;
    s32  extVertexShaderMaxOptimizedVertexShaderVariantsExt;
    s32  extVertexShaderMaxOptimizedVertexShaderLocalConstantsExt;
    s32  extVertexShaderMaxOptimizedVertexShaderInvariantsExt;
    s32  extVertexShaderMaxOptimizedVertexShaderLocalsExt;
    bool atiVertexStreams;
    s32  atiVertexStreamsMaxVertexStreamsATI;
    bool atiDrawBuffers;
    s32  atiDrawBuffersMaxDrawBuffersATI;
    bool nvFragmentProgram;
    s32  nvFragmentProgramMaxFragmentProgramLocalParametersNV;
    s32  nvFragmentProgramMaxTextureCoordsNV;
    s32  nvFragmentProgramMaxTextureImageUnitsNV;
    bool nvFragmentProgram2;
    s32  nvFragmentProgram2MaxProgramExecInstructionsNV;
    s32  nvFragmentProgram2MaxProgramCallDepthNV;
    s32  nvFragmentProgram2MaxProgramIfDepthNV;
    s32  nvFragmentProgram2MaxProgramLoopDepthNV;
    s32  nvFragmentProgram2MaxProgramLoopCountNV;
    bool extFramebufferObject;
    s32  extFramebufferObjectMaxRenderbufferSizeExt;
    s32  extFramebufferObjectMaxColorAttachmentsExt;
    bool extFramebufferMultisample;
    s32  extFramebufferMultisampleMaxSamplesExt;
    bool nvGpuProgram4;
    s32  nvGpuProgram4MaxProgramAttribComponentsNV;
    s32  nvGpuProgram4MaxProgramResultComponentsNV;
    s32  nvGpuProgram4MaxProgramGenericAttribsNV;
    s32  nvGpuProgram4MaxProgramGenericResultsNV;
    bool nvGeometryProgram4;
    s32  nvGeometryProgram4MaxProgramOutputVerticesNV;
    s32  nvGeometryProgram4MaxProgramTotalOutputComponentsNV;
    s32  nvGeometryProgram4MaxGeometryTextureImageUnitsExt;
    bool extGeometryShader4;
    s32  extGeometryShader4MaxGeometryVaryingComponentsExt;
    s32  extGeometryShader4MaxVertexVaryingComponentsExt;
    s32  extGeometryShader4MaxVaryingComponentsExt;
    s32  extGeometryShader4MaxGeometryUniformComponentsExt;
    s32  extGeometryShader4MaxGeometryOutputVerticesExt;
    s32  extGeometryShader4MaxGeometryTotalOutputComponentsExt;
    bool extTextureArray;
    s32  extTextureArrayMaxArrayTextureLayersExt;
    bool extTextureBufferObject;
    s32  extTextureBufferObjectMaxTextureBufferSizeExt;
    bool nvFramebufferMultisampleCoverage;
    s32  nvFramebufferMultisampleCoverageMaxMultisampleCoverageModesNV;
    bool nvParameterBufferObject;
    s32  nvParameterBufferObjectMaxProgramParameterBufferBindingsNV;
    s32  nvParameterBufferObjectMaxProgramParameterBufferSizeNV;
    bool nvTransformFeedback;
    s32  nvTransformFeedbackMaxTransformFeedbackSeparateComponentsNV;
    s32  nvTransformFeedbackMaxTransformFeedbackInterleavedComponentsNV;
    s32  nvTransformFeedbackMaxTransformFeedbackSeparateAttribsNV;
    bool extBindableUniform;
    s32  extBindableUniformMaxVertexBindableUniformsExt;
    s32  extBindableUniformMaxFragmentBindableUniformsExt;
    s32  extBindableUniformMaxGeometryBindableUniformsExt;
    s32  extBindableUniformMaxBindableUniformSizeExt;
    bool extTransformFeedback;
    s32  extTransformFeedbackMaxTransformFeedbackInterleavedComponentsExt;
    s32  extTransformFeedbackMaxTransformFeedbackSeparateAttribsExt;
    s32  extTransformFeedbackMaxTransformFeedbackSeparateComponentsExt;
    bool nvExplicitMultisample;
    s32  nvExplicitMultisampleMaxSampleMaskWordsNV;
    bool nvShaderBufferLoad;
    s32  nvShaderBufferLoadMaxShaderBufferAddressNV;
    bool extShaderImageLoadStore;
    s32  extShaderImageLoadStoreMaxImageUnitsExt;
    s32  extShaderImageLoadStoreMaxCombinedImageUnitsAndFragmentOutputsExt;
    s32  extShaderImageLoadStoreMaxImageSamplesExt;
    bool nvGpuProgram5;
    s32  nvGpuProgram5MaxGeometryProgramInvocationsNV;
    s32  nvGpuProgram5MaxProgramSubroutineParametersNV;
    s32  nvGpuProgram5MaxProgramSubroutineNumNV;
    bool nvTessellationProgram5;
    s32  nvTessellationProgram5MaxProgramPatchAttribsNV;
    bool amdDebugOutput;
    s32  amdDebugOutputMaxDebugMessageLengthAMD;
    s32  amdDebugOutputMaxDebugLoggedMessagesAMD;
    bool amdSparseTexture;
    s32  amdSparseTextureMaxSparseTextureSizeAMD;
    s32  amdSparseTextureMaxSparse3DTextureSizeAMD;
    s32  amdSparseTextureMaxSparseArrayTextureLayers;
};

//! Convert VideoInformation into a human readable form.
String videoInfoToStr(const VideoInfo &vi);

} // namespace mjin2

#endif // MJIN2_VIDEO_INFO_H

